<?php
//   +----------------------------------------------------------------------
//   | Copyright (c) 2015-2025 http://www.hdphp.cn All rights reserved.
//   | Licensed ( http://www.hdphp.cn/licenses/ )
//   | Author: Jack <sophia2152@qq.com>
//   | 官方网址: http://www.hdphp.cn
//   | 这不是一个自由软件！您只能在不用于商业目的的前提下对程序代码进行修改和使用。
//   | 任何企业和个人不允许对程序代码以任何形式任何目的再发布。
//   +----------------------------------------------------------------------
namespace hdphp\traits;

use hdphp\utils\Queue;

/**
 * Trait：快捷加入消息队列
 * 创建人：Jack
 * 创建时间：2023/11/21 16:30
 * @package hdphp\traits
 */
trait QueueTrait
{

    /**
     * 注释：列名
     * 创建人：Jack
     * 创建时间：2023/11/21 16:37
     * @return null
     */
    protected static function queueName()
    {
        return null;
    }

    /**
     * 注释：加入队列
     * 创建人：Jack
     * 创建时间：2023/11/21 16:37
     * @param             $action
     * @param array       $data
     * @param string|null $queueName
     * @return false
     */
    public static function dispatch($action = null, array $data = [], string $queueName = null)
    {
        $queue = Queue::instance()->job(__CLASS__);
        if (is_array($action)) {
            $queue->data(...$action);
        } else if (is_string($action)) {
            $queue->do($action)->data(...$data);
        }
        if ($queueName) {
            $queue->setQueueName($queueName);
        } else if (self::queueName()) {
            $queue->setQueueName(self::queueName());
        }
        return $queue->push();
    }

    /**
     * 注释：延迟加入消息队列
     * 创建人：Jack
     * 创建时间：2023/11/21 16:37
     * @param int         $secs
     * @param             $action
     * @param array       $data
     * @param string|null $queueName
     * @return false
     */
    public static function dispatchSece(int $secs, $action = null, array $data = [], string $queueName = null)
    {
        $queue = Queue::instance()->job(__CLASS__)->secs($secs);
        if (is_array($action)) {
            $queue->data(...$action);
        } else if (is_string($action)) {
            $queue->do($action)->data(...$data);
        }
        if ($queueName) {
            $queue->setQueueName($queueName);
        } else if (self::queueName()) {
            $queue->setQueueName(self::queueName());
        }
        return $queue->push();
    }

    /**
     * 注释：加入小队列
     * 创建人：Jack
     * 创建时间：2023/11/21 16:38
     * @param string      $do
     * @param array       $data
     * @param int|null    $secs
     * @param string|null $queueName
     * @return false
     */
    public static function dispatchDo(string $do, array $data = [], int $secs = null, string $queueName = null)
    {
        $queue = Queue::instance()->job(__CLASS__)->do($do);
        if ($secs) {
            $queue->secs($secs);
        }
        if ($data) {
            $queue->data(...$data);
        }
        if ($queueName) {
            $queue->setQueueName($queueName);
        } else if (self::queueName()) {
            $queue->setQueueName(self::queueName());
        }
        return $queue->push();
    }

}